//
//  IMLogUtils.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/6/23.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

#pragma mark - Log Level Enum

typedef NS_ENUM(NSUInteger, IMLogLevel) {
    IMLogLevelVerbose = 0,  // 详细：显示所有日志信息（仅Debug环境）
    IMLogLevelDebug = 1,    // 调试：显示调试和更高级别日志（仅Debug环境）
    IMLogLevelInfo = 2,     // 信息：显示信息和更高级别日志
    IMLogLevelWarning = 3,  // 警告：显示警告和错误日志
    IMLogLevelError = 4,    // 错误：仅显示错误日志
    IMLogLevelOff = 5       // 关闭：不显示任何日志
};

#pragma mark - Log Tag Enum

typedef NS_ENUM(NSUInteger, IMLogTag) {
    IMLogTagGeneral = 0,        // 通用
    IMLogTagAd = 1,             // 广告通用
    IMLogTagAdRequest = 2,      // 广告请求
    IMLogTagAdShow = 3,         // 广告展示
    IMLogTagAdClick = 4,        // 广告点击
    IMLogTagNetwork = 5,        // 网络
    IMLogTagCache = 6,          // 缓存
    IMLogTagBidding = 7,        // 竞价
    IMLogTagWaterfall = 8,      // 瀑布流
    IMLogTagReward = 9,         // 激励广告
    IMLogTagInterstitial = 10,  // 插屏广告
    IMLogTagBanner = 11,        // 横幅广告
    IMLogTagNative = 12,        // 原生广告
    IMLogTagSDKInit = 13,       // SDK初始化
    IMLogTagInitialization = 14, // 初始化
    IMLogTagError = 15,         // 错误
    IMLogTagPerformance = 16,   // 性能
    IMLogTagAPI = 17,           // API接口
    IMLogTagIAP = 18,           // 内购
    IMLogTagFirebase = 19       // Firebase
};

#pragma mark - Log Configuration

@interface IMLogConfig : NSObject

/// 日志级别
@property (nonatomic, assign) IMLogLevel level;

/// 是否启用控制台日志
@property (nonatomic, assign) BOOL enableConsoleLog;

/// 是否启用文件日志
@property (nonatomic, assign) BOOL enableFileLog;

/// 是否启用日志上传
@property (nonatomic, assign) BOOL enableUpload;

/// 日志目录路径
@property (nonatomic, strong, nullable) NSString *logDirectory;

/// 单个日志文件最大大小（字节）
@property (nonatomic, assign) NSUInteger maxFileSize;

/// 最大保留文件数量
@property (nonatomic, assign) NSUInteger maxFileCount;

/// 自动清理间隔（秒）
@property (nonatomic, assign) NSTimeInterval autoCleanInterval;

/// 文件最大保存时间（秒）
@property (nonatomic, assign) NSTimeInterval maxFileAge;

/// 是否启用敏感信息过滤
@property (nonatomic, assign) BOOL enableSensitiveFilter;

/// 日志上传URL
@property (nonatomic, strong, nullable) NSString *uploadURL;

/// 获取默认配置
+ (instancetype)defaultConfig;

/// 获取调试环境配置
+ (instancetype)debugConfig;

/// 获取发布环境配置
+ (instancetype)releaseConfig;

@end

#pragma mark - Log Utils

@interface IMLogUtils : NSObject

#pragma mark - Initialization

/// 使用配置初始化日志系统
/// @param config 日志配置，传nil使用默认配置
+ (void)initWithConfig:(nullable IMLogConfig *)config;

/// 获取当前配置
+ (IMLogConfig *)currentConfig;

#pragma mark - Configuration

/// 设置日志级别
/// @param level 日志级别
+ (void)setLogLevel:(IMLogLevel)level;

/// 获取当前日志级别
+ (IMLogLevel)currentLogLevel;

/// 启用或禁用日志
/// @param enable 是否启用
+ (void)enableLog:(BOOL)enable;

/// 是否为调试环境
+ (BOOL)isDebugEnvironment;

#pragma mark - Basic Log Methods

/// 详细日志（仅Debug环境）
/// @param tag 日志标签
/// @param format 格式化字符串
+ (void)verbose:(IMLogTag)tag format:(NSString *)format, ...;

/// 调试日志（仅Debug环境）
/// @param tag 日志标签
/// @param format 格式化字符串
+ (void)debug:(IMLogTag)tag format:(NSString *)format, ...;

/// 信息日志
/// @param tag 日志标签
/// @param format 格式化字符串
+ (void)info:(IMLogTag)tag format:(NSString *)format, ...;

/// 警告日志
/// @param tag 日志标签
/// @param format 格式化字符串
+ (void)warning:(IMLogTag)tag format:(NSString *)format, ...;

/// 错误日志
/// @param tag 日志标签
/// @param format 格式化字符串
+ (void)error:(IMLogTag)tag format:(NSString *)format, ...;

#pragma mark - Special Log Methods

/// 记录广告事件
/// @param event 事件名称
/// @param adUnitId 广告单元ID
/// @param params 事件参数
+ (void)logAdEvent:(NSString *)event adUnitId:(NSString *)adUnitId params:(nullable NSDictionary *)params;

/// 记录网络请求
/// @param url 请求URL
/// @param method HTTP方法
/// @param statusCode 响应状态码
/// @param duration 请求耗时（秒）
+ (void)logNetworkRequest:(NSString *)url method:(NSString *)method statusCode:(NSInteger)statusCode duration:(NSTimeInterval)duration;

/// 记录性能数据
/// @param metric 性能指标名称
/// @param value 指标值
/// @param unit 单位
+ (void)logPerformance:(NSString *)metric value:(double)value unit:(NSString *)unit;

/// 记录用户行为
/// @param action 行为名称
/// @param params 行为参数
+ (void)logUserAction:(NSString *)action params:(nullable NSDictionary *)params;

#pragma mark - File Management

/// 获取当前日志文件路径
+ (nullable NSString *)currentLogFilePath;

/// 获取所有日志文件路径
+ (NSArray<NSString *> *)allLogFilePaths;

/// 获取日志文件总大小
+ (NSUInteger)totalLogFileSize;

/// 清理日志文件
+ (void)cleanLogFiles;

/// 压缩日志文件
/// @param filePaths 要压缩的文件路径数组
/// @return 压缩后的文件路径
+ (nullable NSString *)compressLogFiles:(NSArray<NSString *> *)filePaths;

/// 获取日志文件内容
/// @param filePath 文件路径
/// @return 文件内容
+ (nullable NSString *)getLogFileContent:(NSString *)filePath;

#pragma mark - Real-time Log Monitoring

/// 日志监听回调类型
/// @param formattedMessage 格式化后的日志消息
typedef void(^IMLogMonitorCallback)(NSString *formattedMessage);

/// 添加日志监听器
/// @param callback 监听回调
+ (void)addLogMonitor:(IMLogMonitorCallback)callback;

/// 移除日志监听器
+ (void)removeLogMonitor;

#pragma mark - Log Upload

/// 上传日志文件
/// @param completion 完成回调
+ (void)uploadLogFilesWithCompletion:(nullable void(^)(BOOL success, NSError * _Nullable error))completion;

/// 上传指定日志文件
/// @param filePaths 文件路径数组
/// @param completion 完成回调
+ (void)uploadLogFiles:(NSArray<NSString *> *)filePaths completion:(nullable void(^)(BOOL success, NSError * _Nullable error))completion;

#pragma mark - Real-time Log

/// 启用实时日志弹窗（仅Debug环境）
+ (void)enableRealtimeLogPopup;

/// 禁用实时日志弹窗
+ (void)disableRealtimeLogPopup;

/// 显示日志查看器
+ (void)showLogViewer;

/// 隐藏日志查看器
+ (void)hideLogViewer;

#pragma mark - Log Search and Filter

/// 搜索日志
/// @param keyword 关键词
/// @param tag 日志标签，传IMLogTagGeneral搜索所有标签
/// @param completion 搜索结果回调
+ (void)searchLogs:(NSString *)keyword tag:(IMLogTag)tag completion:(void(^)(NSArray<NSString *> *results))completion;

/// 获取指定标签的日志
/// @param tag 日志标签
/// @param completion 结果回调
+ (void)getLogsWithTag:(IMLogTag)tag completion:(void(^)(NSArray<NSString *> *logs))completion;

#pragma mark - Mediation Specific Logs

/// 记录广告加载性能
/// @param adType 广告类型
/// @param platform 聚合平台
/// @param loadTime 加载时间
/// @param success 是否成功
+ (void)logAdLoadPerformance:(NSString *)adType 
          mediationPlatform:(NSString *)platform 
                   loadTime:(NSTimeInterval)loadTime 
                    success:(BOOL)success;

/// 记录竞价结果
/// @param winnerPlatform 胜出平台
/// @param winnerECPM 胜出价格
/// @param loserPlatform 失败平台
/// @param loserECPM 失败价格
/// @param adUnitId 广告单元ID
+ (void)logBiddingResult:(NSString *)winnerPlatform 
            winnerECPM:(NSNumber *)winnerECPM 
         loserPlatform:(NSString *)loserPlatform 
            loserECPM:(NSNumber *)loserECPM 
             adUnitId:(NSString *)adUnitId;

/// 记录聚合切换
/// @param fromPlatform 原平台
/// @param toPlatform 切换到的平台
/// @param reason 切换原因
/// @param adUnitId 广告单元ID
+ (void)logMediationSwitch:(NSString *)fromPlatform 
              toPlatform:(NSString *)toPlatform 
                  reason:(NSString *)reason 
                adUnitId:(NSString *)adUnitId;

@end

#pragma mark - Convenience Macros

// 便捷日志宏定义
#define IM_LOG_VERBOSE(tag, format, ...) [IMLogUtils verbose:tag format:format, ##__VA_ARGS__]
#define IM_LOG_DEBUG(tag, format, ...)   [IMLogUtils debug:tag format:format, ##__VA_ARGS__]
#define IM_LOG_INFO(tag, format, ...)    [IMLogUtils info:tag format:format, ##__VA_ARGS__]
#define IM_LOG_WARNING(tag, format, ...)  [IMLogUtils warning:tag format:format, ##__VA_ARGS__]
#define IM_LOG_ERROR(tag, format, ...)   [IMLogUtils error:tag format:format, ##__VA_ARGS__]

// 常用标签快捷宏
#define IM_LOG_GENERAL(format, ...)      IM_LOG_INFO(IMLogTagGeneral, format, ##__VA_ARGS__)
#define IM_LOG_NETWORK(format, ...)      IM_LOG_INFO(IMLogTagNetwork, format, ##__VA_ARGS__)
#define IM_LOG_AD(format, ...)           IM_LOG_INFO(IMLogTagAd, format, ##__VA_ARGS__)
#define IM_LOG_INIT(format, ...)         IM_LOG_INFO(IMLogTagSDKInit, format, ##__VA_ARGS__)
#define IM_LOG_PERF(format, ...)         IM_LOG_INFO(IMLogTagPerformance, format, ##__VA_ARGS__)
#define IM_LOG_API(format, ...)          IM_LOG_INFO(IMLogTagAPI, format, ##__VA_ARGS__)
// IM_LOG_IAP macro has been removed, use [IMLogUtils info:IMLogTagIAP format:@"message"] instead

NS_ASSUME_NONNULL_END